﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Helper.FullTextIndex;
using System.Collections;

namespace TI.TI_DruginfoAnalizer
{

    public class DrugInfoWordDictionary
    {

        private static RamEngine _index = null;
        private static List<IFullindexObject> _wordCollection = null;
        public static RamEngine Index { get {
            if (_index == null)
            {           
                 PopulateWordCollectionFromDb();
                _index = new RamEngine();   
                _index.IndexCollection(_wordCollection);              
            }

            return _index;        
        } }

        static void  PopulateWordCollectionFromEtalon() {

            // Тащим уникальный набор слов и индексируем его 
            List<IFullindexObject> TradeNmTree = DrugInfoAnalizer.GetEtalon();
            Hashtable wordList = new Hashtable();
            foreach (IFullindexObject i in TradeNmTree)
            {
                foreach (string w in i.Terms)
                {
                    if (w.Length < 3)
                        continue;

                    if (!wordList.ContainsKey(w))
                        wordList.Add(w, new DrugInfoAnalizer.DrugInfoDataItem() { ID = w, ValueInfo = w });

                }
            }


            _wordCollection = new List<IFullindexObject>();
            foreach (IFullindexObject i in wordList.Values) _wordCollection.Add(i);

            _index = new RamEngine();
            _index.IndexCollection(_wordCollection);              
        
        }

        static void PopulateWordCollectionFromDb()
        {
            var r = (List<TI.TI_DruginfoAnalizer.DrugInfoAnalizer.DrugInfoDataItem>)Helper.MongoTools.Instance.GetCollection<TI.TI_DruginfoAnalizer.DrugInfoAnalizer.DrugInfoDataItem>(@"db.DrugInfoWordDictionary.find().toArray();");
            _wordCollection = r.ToList<IFullindexObject>();   

        } 

        /// <summary>
        /// Строит справочник слов встречающихся в наименованиях ЛС
        /// Справочник используется для динамической обработки опечаток
        /// </summary>
        public static void Rebuild(){

            _wordCollection = null;
            _index = null;

            //обращаемся к свойству формируем _wordCollection
            PopulateWordCollectionFromEtalon();
            
            //чистим табличку со словами 
            string script = @"db.DrugInfoWordDictionary.remove({});";

            Helper.MongoTools.Instance.ExecuteScript(script);
            
            //пишем сызнова
            foreach (IFullindexObject i in _wordCollection) {
                script = "db.DrugInfoWordDictionary.insert(" + i.ToString ()+ ");";
                Helper.MongoTools.Instance.ExecuteScript(script);
            }
            
        }

        /// <summary>
        /// На основании справочника слов - слова поступившего предложения
        /// </summary>
        /// <param name="Sentence"></param>
        /// <returns></returns>
        public static string EditSentence(string Sentence) {

            List<string> rules= new List<string> ();
            //список слов в предложении 
            List<string> sentence_words = RamEngine.ParseText(Sentence);
            foreach (string s1 in sentence_words)
            {
                List<SearchResult> like = Index.Search(RamEngine.ClearForbiddenChar(s1) + "~0.7");
                //похожего ничего нет - проходим мимо
                if (like.Count == 0)
                                continue;
                
                //ищем в похожем
                foreach (SearchResult s2 in like)
                {
                    //в справочнике есть это слово - в слове нет ошибок идем дальше
                    if (s1.ToUpper() == s2.ValueInfo.ToUpper())
                        break;        

                    //стоимость перехода 0-1 подменяем 
                    if (Helper.TextTools.GetValueOfStringTransform(s1, s2.ValueInfo, ref  rules) < 2)
                        Sentence = Sentence.Replace(s1, s2.ValueInfo);
                } 

            }

            return Sentence;
        }

    }
}
